package clienteBaseDatos;

import accesoBD.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Aplicación cliente por consola realizada para ejemplificar el uso del
 * controlador y las query.
 * ATENCIÓN: la funcionalidad es incompleta, sólo se abarcan algunos de métodos
 * más importantes.
 * @version 1.2
 * @author Juan Manuel Rodríguez González
 */
public class ClienteCompleto {

    private static String[] login(BufferedReader bf) {
        String userpass[] = new String[2];
        System.out.println("0 -> LOGIN");
        try {
            System.out.println("0.1 -> Introduzca usuario: ");
            userpass[0] = bf.readLine();
            System.out.println("0.1 -> Introduzca contraseña: ");
            userpass[1] = bf.readLine();
        } catch (IOException ex) {
            Logger.getLogger(ClienteCompleto.class.getName()).log(Level.SEVERE, null, ex);
        }

        return userpass;
    }

    private static void verPartes(GenericQuery query) throws SQLException {
        ResultSet rs = ((QueryUsuario) query).getPartesDeUsuario();
        OutputResultSet.mostrarTodoConsola(rs);
    }

    private static void crearParte(GenericQuery query, BufferedReader bf) throws SQLException {
        //OutputResultSet.mostrarTodoConsola(((QueryUsuario) query).getAparatos());
        String idAparato = "",
                descripcionParte = "";
        try {
            System.out.print("Introduzca el id del aparato: ");
            idAparato = bf.readLine();
            System.out.print("Describa en pocas palabras la incidencia: ");
            descripcionParte = bf.readLine();
        } catch (IOException ex) {
        }

        boolean creado = ((QueryUsuario) query).crearParte(idAparato, descripcionParte);

        System.out.println(creado ? "Insercion CORRECTA" : "Insercion ERRONEA");
    }

    private static void verPartesResponsable(GenericQuery query) throws SQLException {
        ResultSet rs = ((QueryTecnico) query).getPartesResposable();
        OutputResultSet.mostrarTodoConsola(rs);
    }

    private static void verPartesReasignados(GenericQuery query) throws SQLException {
        ResultSet rs = ((QuerySupervisor) query).getPartesAsignados();
        OutputResultSet.mostrarTodoConsola(rs);
    }

    private static void verPartesConcluidos(GenericQuery query) throws SQLException {
        ResultSet rs = ((QueryTecnico) query).getPartesCompletados();
        OutputResultSet.mostrarTodoConsola(rs);
    }

    private static void reasignarParte(GenericQuery query, BufferedReader bf) throws SQLException {
        String idUsuarioTec = "", idParte = "";
        try {
            System.out.print("Introduzca el id del nuevo tecnico: ");
            idUsuarioTec = bf.readLine();
            System.out.print("Introduzca el id del parte de incidencia: ");
            idParte = bf.readLine();
        } catch (IOException ex) {
        }

        boolean creado = ((QuerySupervisor) query).reasignarParte(idUsuarioTec, idParte);

        System.out.println(creado ? "Reasignacion CORRECTA" : "Reasignacion ERRONEA");
    }

    private static void añadirIncidencia(GenericQuery query, BufferedReader bf) throws SQLException {
        String dispositivo = "", marca = "", modelo = "", diagnostico = "", causa = "", idParte = "";
        try {
            System.out.print("Introduzca el nombre del dispositivo: ");
            dispositivo = bf.readLine();
            System.out.print("Introduzca la marca: ");
            marca = bf.readLine();
            System.out.print("Introduzca el modelo: ");
            modelo = bf.readLine();
            System.out.print("Especifique el diagnostico: ");
            diagnostico = bf.readLine();
            System.out.print("Especifica la posible causa: ");
            causa = bf.readLine();
            System.out.print("Indique el parte al que se asocia la incidencia: ");
            idParte = bf.readLine();
        } catch (IOException ex) {
        }

        boolean creado = ((QueryTecnico) query).añadirIncidencia(Integer.parseInt(idParte), diagnostico);

        System.out.println(creado ? "Incidencia creada" : "Incidencia NO creada");
    }

    private static void cerrarParte(GenericQuery query, BufferedReader bf) throws SQLException {
        String idParte = "";
        try {
            System.out.print("Introduzca el id del parte: ");
            idParte = bf.readLine();
        } catch (IOException ex) {
        }
        boolean exito = ((QueryTecnico) query).cerrarParte(idParte);
        System.out.println(exito ? "Parte cerrado" : "Parte NO cerrado");
    }

    private static void crearAparato(GenericQuery query, BufferedReader bf) throws SQLException {
        String nombre = "", codigoPub = "", condigoInt = "", marca = "", modelo = "", color = "", garantia = "", ubicacion = "";

        try {
            System.out.print("Introduzca el nombre: ");
            nombre = bf.readLine();
            System.out.print("Introduzca el codigo publico: ");
            codigoPub = bf.readLine();
            System.out.print("Introduzca el codigo privado: ");
            condigoInt = bf.readLine();
            System.out.print("Introduzca la marca: ");
            marca = bf.readLine();
            System.out.print("Introduzca el modelo: ");
            modelo = bf.readLine();
            System.out.print("Introduzca el color: ");
            color = bf.readLine();
            System.out.print("Introduzca la garantia: ");
            garantia = bf.readLine();
            System.out.print("Introduzca el id de su ubicacion: ");
            ubicacion = bf.readLine();
        } catch (IOException ex) {
        }
        ((QuerySupervisor) query).crearAparato(nombre, codigoPub, condigoInt, marca, modelo, color, garantia, ubicacion);
    }

    public static void main(String[] args) {
        try {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            GenericQuery query = null;
            ResultSet rs;
            boolean ok = false;
            int opciones, nivel1 = -1, nivel2 = -1, nivel3 = -1;
            String[] userpass;

            do {
                System.out.println("\nBIENVENIDO AL SISTEMA DE PARTES");
                // Menu de usuario
                System.out.println("-1 -> Exit");
                System.out.println("0 -> LOGIN");
                System.out.print("\nElija una opcion: ");

                try {
                    nivel1 = Integer.parseInt(bf.readLine());
                } catch (IOException n) {
                    nivel1 = -2;
                }

                switch (nivel1) {
                    case -1:
                        System.exit(0);
                    case 0:
                        userpass = login(bf);
                        query = GenericQuery.login(userpass[0], userpass[1]);
                        if (QueryError.class.isInstance(query)) {
                            System.out.println("FALLO DE LOGIN, INTENTE OTRA VEZ\n");
                        } else {
                            System.out.println("LOGIN OK\n");
                            nivel2 = 0;
                        }

                        break;

                    default:
                        System.out.println("--- opcion incorrecta, vuelva a intentarlo ---");
                        break;
                }

                while (nivel2 != -1) {
                    System.out.println("-1: Volver");
                    System.out.println("1: Ver partes de usuario");
                    System.out.println("2: Crear un nuevo parte");
                    System.out.println("3: Acceso tecnico / supervisor");
                    System.out.print("Introduzca opcion: ");
                    try {
                        nivel2 = Integer.parseInt(bf.readLine());
                    } catch (IOException ex) {
                        nivel2 = -2;
                    }

                    switch (nivel2) {
                        case -1:
                            break;
                        case 1:
                            verPartes(query);
                            break;
                        case 2:
                            crearParte(query, bf);
                            break;
                        case 3:
                            if (QueryTecnico.class.isInstance(query)) {
                                do {
                                    System.out.println("-1: Volver");
                                    System.out.println("1: Ver partes responsable");
                                    System.out.println("2: Ver partes concluidos");
                                    System.out.println("3: Añadir incidiencia a un parte");
                                    System.out.println("4: Cerrar un parte");
                                    System.out.print("Introduzca opcion: ");
                                    try {
                                        nivel2 = Integer.parseInt(bf.readLine());
                                    } catch (IOException ex) {
                                        nivel2 = -1;
                                    }

                                    switch (nivel2) {
                                        case -1:
                                            break;
                                        case 1:
                                            verPartesResponsable(query);
                                            break;
                                        case 2:
                                            verPartesConcluidos(query);
                                            break;
                                        case 3:
                                            añadirIncidencia(query, bf);
                                            break;
                                        case 4:
                                            cerrarParte(query, bf);
                                            break;
                                        case 5:
                                            //verPartesResponsable(query);
                                            break;
                                        default:
                                            System.out.println("--- opcion incorrecta, vuelva a intentarlo ---");
                                            break;
                                    }
                                } while (nivel2 != -1);
                            } else if (QuerySupervisor.class.isInstance(query)) {
                                do {
                                    System.out.println("-1: Volver");
                                    System.out.println("1: Ver partes reasignados");
                                    System.out.println("2: Reasignar un parte a otro tecnico");
                                    System.out.println("3: Añadir aparato");
                                    System.out.println("4: Modificar aparato");
                                    System.out.print("Introduzca opcion: ");
                                    try {
                                        nivel2 = Integer.parseInt(bf.readLine());
                                    } catch (IOException ex) {
                                        nivel2 = -1;
                                    }

                                    switch (nivel2) {
                                        case -1:
                                            break;
                                        case 1:
                                            verPartesReasignados(query);
                                            break;
                                        case 2:
                                            reasignarParte(query, bf);
                                            break;
                                        case 3:
                                            crearAparato(query, bf);
                                            break;
                                        case 4:
                                            //modificarAparato(query, bf);
                                            break;
                                        default:
                                            System.out.println("--- opcion incorrecta, vuelva a intentarlo ---");
                                            break;
                                    }
                                } while (nivel2 != -1);
                            }

                            break;
                        default:
                            System.out.println("--- opcion incorrecta, vuelva a intentarlo ---");
                            break;
                    }
                }

            } while (nivel1 != -1);
        } catch (SQLException ex) {
            System.out.println("EXCEPCION: " + ex);
        } catch (ClassNotFoundException ex) {
            System.out.println("EXCEPCION: " + ex);
        }
    }
}
